#pragma once

#include <unistd.h>
#include <sys/syscall.h>

// 主要用于 获取当前线程 的唯一标识符（tid）。
// 命名空间的声明，命名空间提供了一种组织代码的方法，避免了全局命名冲突
namespace CurrentThread
{
    // 声明一个线程局部存储的变量, 用于缓存线程的tid
    extern __thread int t_cachedTid;

    // 此函数用于缓存线程的tid
    void cacheTid();

    // 内联函数, 用于获取线程的tid
    inline int tid()
    {   
        /**
         * long __builtin_expect(long exp, long c);
         *     其中，exp 是表达式的值，c 是预期结果。通常情况下，c 的取值为 0 或 1，表示分支的预期结果为假或真。
         * 函数的返回值等于 exp 的值。
         *     通过使用 __builtin_expect() 函数，告诉编译器，期望 t_cachedTid 的值不为 0，使得编译器在生成
         * 机器代码时更倾向于将执行流程优化为 if 条件不成立的情况，从而提高程序的性能。
        */
        // 如果t_cachedTid为0，说明还未缓存tid
        if (__builtin_expect(t_cachedTid == 0, 0))
        {
            cacheTid(); // 调用cacheTid函数进行缓存
        } 
        return t_cachedTid;  // 返回缓存的tid
    }
}

